#pragma once
#include <iostream>
#include <functional>
#include "Log.hpp"
#include "Protocol.hpp"
#include "Socket.hpp"
#include "Connection.hpp"
#include"NetCal.hpp"
using namespace socket_ns;

// 只负责文件I/O,业务逻辑由回调函数执行
class PackageParase
{
public:
    PackageParase()
    {
    }
    void ExuteIO(Connection* conn)
    {
        while (true)
        {
            // 报文解析
            std::string package = DeCode(conn->GetInbuffer()); // 每解析一个删一个
            if (package.empty())
                break; // 不是一个完整报文
            // 反序列化
            auto req = Factory::BuildRequest(); // 构建一个Request对象
            if (!req->Deserialize(package))
            {
                LOG(ERROR, "反序列化请求失败");
                continue;
            }
            LOG(INFO, "收到请求: %d %c %d", req->_x, req->_oper, req->_y);
            // 业务处理(网络计算器)
            Calculator cal;
            auto resp = cal.Cal(req); // 业务处理逻辑
            // 序列化应答
            std::string response;
            resp->Serialize(&response); // 序列化存在response中
            // 添加报头
            response = EnCode(response);
            //添加到输出缓冲区
            conn->SetOutbuffer(response);
        }
        //此时至少有一个完整报文应答
        // 直接发往客户端
        if(!conn->GetOutbuffer().empty()) conn->_handler_sender(conn);
    }
    ~PackageParase()
    {
    }
};;